import Dict from './Dict'
import { mergeOptions } from './DictOptions'

export default function (Vue, options) {
  // 调用/utils/dict/DictOptions.js下的mergeOptions
  // mergeOptions方法再调用ruoyi.js的合并方法 将传过来的数据合并
  mergeOptions(options)
  // 往下走
  Vue.mixin({
    // 定义了一个Dict对象
    data() {
      // 如果页面没有设置dicts 是就return返回
      if (this.$options === undefined || this.$options.dicts === undefined || this.$options.dicts === null) {
        return {}
      }
      // 创建Dict实列赋值给dict对象
      const dict = new Dict()
      dict.owner = this
      return {
        dict
      }
    },
    created() {
      // 判断this.dict是否创建Dict的实列对象如果没有就结束代码避免往下发生更严重的错误
      if (!(this.dict instanceof Dict)) {
        return
      }
      // 判断options.onCreated 是否存在，如果存在，则执行该函数，并将 this.dict 作为参数传入
      options.onCreated && options.onCreated(this.dict)
      // 调用Dict.js中的init方法，因为this.dict注入了Dict的实例对象所以可以这么调用
      // 传入页面中绑定的dicts数组.执行init方法后，进入then
      // 执行完init方法后，就会执行index.js中的request(dictMeta)方法因为this.dict.init方法是异步执行的，对异步处理的结果需要使用Promise 的 then/catch 方法
      this.dict.init(this.$options.dicts).then(() => {
        // 执行完回调的request(dictMeta)方法后的所有方法后触发下面的代码
        // 判断options.onReady 是否存在，如果存在，则执行该函数，并将 this.dict 作为参数传入
        options.onReady && options.onReady(this.dict)
        this.$nextTick(() => {
          this.$emit('dictReady', this.dict)
          if (this.$options.methods && this.$options.methods.onDictReady instanceof Function) {
            this.$options.methods.onDictReady.call(this, this.dict)
          }
        })
      })
    },
  })
}
